En el post anterior examinamos como obtener el \(R_0\) utilizando modelos compartamentales SIR, lo cual nos puede ayudar a estimar el impacto de la epidemia.
Ahora que ya han pasado algunos dias, contamos con mas informacion acerca del comportamiento de la enfermedad en el pais y podemos ver en una linea del tiempo (transquilos, no es otro grafico exponencial) el progreso de COVID en Mexico.
Los datos que utilizare fueron colectados por Gabriel Carranco basados en la informacion dada a conocer por el Gobierno Federal de México desglosada por entidad.
Cabe destacar que este analisis esta hecho con la informacion disponible de los casos, y puede estar sesgada a sobrerepresentar la mortalidad o subrepresentar el numero de casos
Vision general de COVID en Mexico.
En la siguiente figura, podemos ver el incremento en numero de casos importados (rojo obscuro) y casos locales (rojo) estratificado por estado.

Podemos notar como en algunos estados como San Luis, Puebla y Jalisco los casos importados diagnosticados siguen en asenso, lo cual nos podria dar un indicio sobre como se estan llevando a cabo las recomendaciones sobre el movimiento accesando al estado. Por el contrario, otros estados como Tabasco y Michoacan muestran un incremento en el numero de casos locales diagnosticados, lo cual podria ser un indicador sobre el ingremento en la transmision local dentro del estado. En el siguiente mapa, se muestra la proporcion de casos locales por estado.

En la siguiente figura exploramos el incremento en el numero cumulativo de casos totales. Claramente la incidencia va en aumento en la mayoria de los estados. Cabe destacar que aunque las barras de los graficos parecen de la misma magnitud, las escalas del eje y son diferentes. La intensidad de las barras representan el numero total de casos en el estado.

Otro de los indicadores que podemos utilizar para evaluar el impacto de la epidemia es la mortalidad. Como lo he mencionado anteriormente, la mortalidad estimada a partir de los casos tendera a estar inflada, ya que la enfermedad se presenta de manera sublclinica en muchos de los casos y no requiere hospitalizacion. A continuacion vemos un mapa en el cual la intensidad del color refleja la mortalidad bruta de la enfermedad, Cabe destacar que aunque algunos estados como Hidalgo, Durango y Morelos presentan una mortalidad alta, el numero total de infectados es mucho menor que otras ciudades mas grandes. Esto tambien puede ser un indicador de la necesidad de incrementar el numero de muestreos para asi poder detectar no solo a los pacientes que llegan a hospital en estado critico (wue son los que tenderan mas a padecer de la enfermedad).

Estimacion de \(R_0\)
Como lo discutimos en el post anterior, un indicador que nos ayuda a estimar la magnitud de las epidemias es el numero \(R_0\), el cual representa el numero de casos secundarios producidos. Anteriormente calculamos un \(R_0\) para todo el periodo de la epidemia, lo cual nos da una idea de la magnitud de una manera global. Similar a \(R_0\), existe otro indicador de el numero de casos secundarios para el dia-a-dia (\(R_e\)), esto nos puede ayudar a darle un seguimiento temporal a el impacto de la enfermedad. Existen varios metodos para calcular \(R_e\), a continuacion usaremos un metodo desarrollado por Anne Cori y extendido posteriormente por Thompson et al.. Para esto utilizaremos el paquete de R EpiEstim. Uno de los principales parametros para estimar \(R_e\) es el el intervalo serial (SI), el cual es el tiempo entre el inicio de los sintomas de cada caso y el incio de los sintomas de un caso secundario a este (en otras palabras es el tiempo entre casos). Tomaremos la distribucion de SI descrita por Li et. al, en la cual se estimo una media de 7.5 dias con una desviacion estandard de 3.4 dias. Dado que aun desconocemos muchos aspectos de la enfermedad, introduciremos algunos parametros adicionales para permitir que el parametro SI tenga una variacion entre 2.3 y 8.4 usando una distribucion estandard con \(\sigma = 2\).

En nuestrso resultados podemos observar el \(R_e\) estimado en una linea del tiempo. Como mencionamos anteriormente, el objetivo para evitar que una enfermedad se convierta en epidemia es mantener el \(R_e\) por debajo de uno (el cual esta marcado con una linea punteada). La linea de enmedio representa nuestra estimacion y el sombreado que la envelve es la incertidumbre de nuestra estimacion (nuestro verdadero valor podria estar en cualquier parte del area sombreada). Es importante destacar que los ejes estan en diferentes escalas, podemos que aunque el patron para Puebla y el Estado de Mexico es parecido, los valores para el Estado de Mexico podrian alcanzar hasta un \(R_e\) de 6.

Suponiendo que el numero de casos reportados refleja con certeza la progresion de la enfermedad, nuestro analisis nos dice que la enfermedad va decreciendo en estados como Nuevo Leon, Jalisco y Yucatan. Para los estados de Nuevo Leon y Jalisco el \(R_e\) se mantiene por debajo de la linea que marca el 1 y se debe mantener asi si queremos eliminar la transmision. En cambio en CDMX, estado de Mexico y Puebla vemos que hubo una decaida en el \(R_e\) y ha vuelto a aumentaren los ultimos dias, recordemos que este analiss esta basado en el numero de individuos detectados y no necesariamente el numero total de infectados. El hecho de que el \(R_e\) vaya en aumento, tambien podria reflejar el incremento en los esfuerzos de deteccion de la enfermedad.
En resumen, algunas de estas herramientas podrian ser utilizadas para informar los lugares en los que la enfermedad va en asenso y otros lugares que necesitan mas esfuerzos en cuanto a la deteccion de la enfermedad.
Apendice
Por ultimo, anexo el codigo por si se desea replicar el analisis. El codigo a continuacion describe lo realizado en este post y para acceder a los datos y darles el formato necesario en este analisis se puede seguir el codigo que se encuentra en este SCRIPT
LS0tDQp0aXRsZTogIkVzdGltYWNpb24gZGUgUiBJbnN0YW50YW5lbyINCi0tLQ0KDQpgYGB7ciB3YXJuaW5nPUYsIG1lc3NhZ2U9RiwgZWNobyA9IEZ9DQojT3BjaW9uZXMgcGFyYSBjb3JyZXIgZWwgZG9jdW1lbnRvIChObyBlcyBuZWNlc2FyaW8gY29ycmVyIGVzdGEgbGluZWEpDQprbml0cjo6b3B0c19jaHVuayRzZXQod2FybmluZyA9IEYsIG1lc3NhZ2UgPSBGLCBlY2hvID0gRikNCiMgTGlicmVyaWFzIHF1ZSB1c2Ftb3MNCmxpYnJhcnkoc2YpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHRtYXApDQpsaWJyYXJ5KGVhcmx5UikNCmxpYnJhcnkoRXBpRXN0aW0pDQpsaWJyYXJ5KGluY2lkZW5jZSkNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGdncHVicikNCiMgQ2FyZ2FyIGxvcyBkYXRvcyAodmVyIHNjcmlwdCBzb2JyZSBjb21vIHNlIG9idHV2aWVyb24pDQpDYXNlc19Fc3RhZG8gPC0gcmVhZC5jc3YoIkRhdGEvQ2FzZXNFc3QuY3N2IikgJT4lDQogIG11dGF0ZShGZWNoYSA9IGFzLkRhdGUoRmVjaGEsICIlWS0lbS0lZCIpKQ0KYGBgDQoNCkVuIGVsIFtwb3N0IGFudGVyaW9yXShFc3RpbWFjaW9uX1IwLmh0bWwpIGV4YW1pbmFtb3MgY29tbyBvYnRlbmVyIGVsICRSXzAkIHV0aWxpemFuZG8gbW9kZWxvcyBjb21wYXJ0YW1lbnRhbGVzIFNJUiwgbG8gY3VhbCBub3MgcHVlZGUgYXl1ZGFyIGEgZXN0aW1hciBlbCBpbXBhY3RvIGRlIGxhIGVwaWRlbWlhLiAgDQpBaG9yYSBxdWUgeWEgaGFuIHBhc2FkbyBhbGd1bm9zIGRpYXMsIGNvbnRhbW9zIGNvbiBtYXMgaW5mb3JtYWNpb24gYWNlcmNhIGRlbCBjb21wb3J0YW1pZW50byBkZSBsYSBlbmZlcm1lZGFkIGVuIGVsIHBhaXMgeSBwb2RlbW9zIHZlciBlbiB1bmEgbGluZWEgZGVsIHRpZW1wbyAodHJhbnNxdWlsb3MsIG5vIGVzIG90cm8gZ3JhZmljbyBleHBvbmVuY2lhbCkgZWwgcHJvZ3Jlc28gZGUgQ09WSUQgZW4gTWV4aWNvLiAgDQpMb3MgZGF0b3MgcXVlIHV0aWxpemFyZSBmdWVyb24gY29sZWN0YWRvcyBwb3IgR2FicmllbCBDYXJyYW5jbyBiYXNhZG9zIGVuIGxhIGluZm9ybWFjaW9uIGRhZGEgYSBjb25vY2VyIHBvciBlbCBHb2JpZXJubyBGZWRlcmFsIGRlIE3DqXhpY28gZGVzZ2xvc2FkYSBwb3IgZW50aWRhZC4gIA0KICANCioqQ2FiZSBkZXN0YWNhciBxdWUgZXN0ZSBhbmFsaXNpcyBlc3RhIGhlY2hvIGNvbiBsYSBpbmZvcm1hY2lvbiBkaXNwb25pYmxlIGRlIGxvcyBjYXNvcywgeSBwdWVkZSBlc3RhciBzZXNnYWRhIGEgc29icmVyZXByZXNlbnRhciBsYSBtb3J0YWxpZGFkIG8gc3VicmVwcmVzZW50YXIgZWwgbnVtZXJvIGRlIGNhc29zKiogIA0KICANCiMgVmlzaW9uIGdlbmVyYWwgZGUgQ09WSUQgZW4gTWV4aWNvLg0KDQpFbiBsYSBzaWd1aWVudGUgZmlndXJhLCBwb2RlbW9zIHZlciBlbCBpbmNyZW1lbnRvIGVuIG51bWVybyBkZSBjYXNvcyBpbXBvcnRhZG9zIChyb2pvIG9ic2N1cm8pIHkgY2Fzb3MgbG9jYWxlcyAocm9qbykgZXN0cmF0aWZpY2FkbyBwb3IgZXN0YWRvLg0KDQpgYGB7ciBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9MTJ9DQojIyMjIw0KIyBDcmVhciBsYXMgc2VyaWVzIHRlbXBvcmFsZXMgcG9yIGVzdGFkbzoNCkNhc2VzX0VzdGFkbyAlPiUNCiAgZmlsdGVyKEkgPiAwKSAlPiUNCiAgZ2dwbG90KC4sIGFlcyh4ID0gRmVjaGEpKSArDQogIGdlb21fbGluZShhZXMoeSA9IEkpLCBjb2xvciA9ICJkYXJrcmVkIikgKw0KICBnZW9tX2xpbmUoYWVzKHkgPSBMKSwgY29sb3IgPSAicmVkIikgKw0KICBmYWNldF93cmFwKH5Db2RlLCBuY29sID0gNCkgKw0KICB5bGFiKCJOdW1lcm8gZGUgY2Fzb3MiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJsZWZ0IiwgDQogICAgICAgICAgc3RyaXAudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9NCkpDQpgYGANCiAgDQpQb2RlbW9zIG5vdGFyIGNvbW8gZW4gYWxndW5vcyBlc3RhZG9zIGNvbW8gU2FuIEx1aXMsIFB1ZWJsYSB5IEphbGlzY28gbG9zIGNhc29zIGltcG9ydGFkb3MgZGlhZ25vc3RpY2Fkb3Mgc2lndWVuIGVuIGFzZW5zbywgbG8gY3VhbCBub3MgcG9kcmlhIGRhciB1biBpbmRpY2lvIHNvYnJlIGNvbW8gc2UgZXN0YW4gbGxldmFuZG8gYSBjYWJvIGxhcyByZWNvbWVuZGFjaW9uZXMgc29icmUgZWwgbW92aW1pZW50byBhY2Nlc2FuZG8gYWwgZXN0YWRvLiBQb3IgZWwgY29udHJhcmlvLCBvdHJvcyBlc3RhZG9zIGNvbW8gVGFiYXNjbyB5IE1pY2hvYWNhbiBtdWVzdHJhbiB1biBpbmNyZW1lbnRvIGVuIGVsIG51bWVybyBkZSBjYXNvcyBsb2NhbGVzIGRpYWdub3N0aWNhZG9zLCBsbyBjdWFsIHBvZHJpYSBzZXIgdW4gaW5kaWNhZG9yIHNvYnJlIGVsIGluZ3JlbWVudG8gZW4gbGEgdHJhbnNtaXNpb24gbG9jYWwgZGVudHJvIGRlbCBlc3RhZG8uIEVuIGVsIHNpZ3VpZW50ZSBtYXBhLCBzZSBtdWVzdHJhIGxhIHByb3BvcmNpb24gZGUgY2Fzb3MgbG9jYWxlcyBwb3IgZXN0YWRvLiAgICAgIA0KICANCmBgYHtyfQ0KIyMjIyMjIyMjIyMjIyMjDQojIE9idGVuZXIgdW4gcmVzdW1lbiBkZSBsYSBtb3J0YWxpZGFkIHkgcHJvcG9yY2lvbiBkZSBjYXNvcyBsb2NhbGVzDQpFc3RhZG9zX3N1bSA8LSBDYXNlc19Fc3RhZG8gJT4lDQogIGdyb3VwX2J5KEVzdGFkbykgJT4lDQogIHN1bW1hcmlzZV9hdCgudmFycyA9IGMoIlRvdGFsX0kiLCAiSSIsICJEIiwgIkwiLCAiUyIsICJSIiksIC5mdW5zID0gfm1heCguLCBuYS5ybSA9IFQpKSAlPiUNCiAgbXV0YXRlKG1vcnRhbGlkYWQgPSBEL1RvdGFsX0ksIHBfTG9jYWxlcyA9IEwvVG90YWxfSSkgJT4lDQogIGFycmFuZ2UoZGVzYyhUb3RhbF9JKSkNCiMjIyMjIyMjIyMjIyMjIyMjIyMNCiMgQ2FyZ2FyIHVuIG1hcGEgZGUgTWV4aWNvDQpNZXgxIDwtIHJlYWRSRFMoIkRhdGEvZ2FkbTM2X01FWF8xX3NwLnJkcyIpICU+JQ0KICBzdF9hc19zZigpICU+JQ0KICBzZWxlY3QoTkFNRV8xKSAlPiUNCiAgbXV0YXRlKE5BTUVfMSA9IGljb252KGdzdWIocGF0dGVybiA9ICJESVNUUklUTyBGRURFUkFMIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gIkNJVURBRCBERSBNw4lYSUNPIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdXBwZXIoTkFNRV8xKSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSA9ICJVVEYtOCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgdG8gPSAiQVNDSUkvL1RSQU5TTElUIikpICU+JQ0KICByZW5hbWUoRXN0YWRvID0gTkFNRV8xKQ0KIyMjIyMjDQojIENyZWFyIHBhbGV0YSBkZSBjb2xvcmVzIHBhcmEgZWwgbWFwYQ0KY29scGFsIDwtIGdyRGV2aWNlczo6Y29sb3JSYW1wUGFsZXR0ZShjb2xvcnMgPSBjKCJibGFjayIsICJnb2xkMyIpKSg1KQ0KIyMjIyMNCiMgVW5pciBsYSBiYXNlIGRlIGRhdG9zIGNvbiBlbCBjb2RpZ28gZGVsIGVzdGFkbw0KTWFwREYgPC0gTWV4MSAlPiUNCiAgbGVmdF9qb2luKEVzdGFkb3Nfc3VtLCBieSA9ICJFc3RhZG8iKQ0KIyMjIyMNCiMgQ3JlYXIgZWwgbWFwYSBkZSBwcm9wb3JjaW9uIGRlIGNhc29zIGxvY2FsZXMgZGV0ZWN0YWRvcw0KdG1fc2hhcGUoTWFwREYpICsNCiAgdG1fcG9seWdvbnMoY29sID0gInBfTG9jYWxlcyIsIHN0eWxlID0gImplbmtzIiwgcGFsZXR0ZSA9IGNvbHBhbFstMV0sIGNvbG9yTkEgPSBjb2xwYWxbMV0sIGJvcmRlci5jb2wgPSAiYmxhY2siKSArDQogIHRtX2xheW91dChmcmFtZSA9IEYsIGxlZ2VuZC5vdXRzaWRlID0gVCwgbGVnZW5kLm91dHNpZGUucG9zaXRpb24gPSAicmlnaHQiLCBtYWluLnRpdGxlID0gIlByb3BvcmNpb24gZGUgQ2Fzb3MgTG9jYWxlcyBwb3IgRXN0YWRvIikgDQpgYGANCiAgDQogIA0KRW4gbGEgc2lndWllbnRlIGZpZ3VyYSBleHBsb3JhbW9zIGVsIGluY3JlbWVudG8gZW4gZWwgbnVtZXJvIGN1bXVsYXRpdm8gZGUgY2Fzb3MgdG90YWxlcy4gQ2xhcmFtZW50ZSBsYSBpbmNpZGVuY2lhIHZhIGVuIGF1bWVudG8gZW4gbGEgbWF5b3JpYSBkZSBsb3MgZXN0YWRvcy4gQ2FiZSBkZXN0YWNhciBxdWUgYXVucXVlIGxhcyBiYXJyYXMgZGUgbG9zIGdyYWZpY29zIHBhcmVjZW4gZGUgbGEgbWlzbWEgbWFnbml0dWQsIGxhcyBlc2NhbGFzIGRlbCBlamUgKnkqIHNvbiBkaWZlcmVudGVzLiBMYSBpbnRlbnNpZGFkIGRlIGxhcyBiYXJyYXMgcmVwcmVzZW50YW4gZWwgbnVtZXJvIHRvdGFsIGRlIGNhc29zIGVuIGVsIGVzdGFkby4gICANCg0KYGBge3IgZmlnLmhlaWdodD0xNSwgZmlnLndpZHRoPTZ9DQojIyMjIw0KIyBDcmVhciBncmFmaWNvcyBkZSBjYXNvcyBjdW11bGF0aXZvcyB0b3RhbGVzIHBvciBlc3RhZG8NCkNhc2VzX0VzdGFkbyAlPiUNCiAgZmlsdGVyKFRvdGFsX0kgPiAwKSAlPiUNCiAgZ3JvdXBfYnkoQ29kZSkgJT4lDQogIG11dGF0ZShUb3RhbCA9IG1heChUb3RhbF9JKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhUb3RhbCksIEZlY2hhKSAlPiUgDQogIG11dGF0ZShDb2RlX2YgPSBmYWN0b3IoQ29kZSwgbGV2ZWxzID0gdW5pcXVlKC4kQ29kZSkpKSAlPiUNCiAgZ2dwbG90KGFlcyhGZWNoYSwgVG90YWxfSSwgZmlsbCA9IFRvdGFsKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKw0KICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdyA9ICJibGFjayIsIGhpZ2ggPSAicmVkIikgKw0KICB5bGFiKCJUb3RhbCBkZSBJbmZlY3RhZG9zIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBmYWNldF9ncmlkKENvZGVfZiB+Liwgc2NhbGVzPSJmcmVlX3kiKQ0KYGBgDQoNCk90cm8gZGUgbG9zIGluZGljYWRvcmVzIHF1ZSBwb2RlbW9zIHV0aWxpemFyIHBhcmEgZXZhbHVhciBlbCBpbXBhY3RvIGRlIGxhIGVwaWRlbWlhIGVzIGxhIG1vcnRhbGlkYWQuIENvbW8gbG8gaGUgbWVuY2lvbmFkbyBhbnRlcmlvcm1lbnRlLCBsYSBtb3J0YWxpZGFkIGVzdGltYWRhIGEgcGFydGlyIGRlIGxvcyBjYXNvcyB0ZW5kZXJhIGEgZXN0YXIgaW5mbGFkYSwgeWEgcXVlIGxhIGVuZmVybWVkYWQgc2UgcHJlc2VudGEgZGUgbWFuZXJhIHN1YmxjbGluaWNhIGVuIG11Y2hvcyBkZSBsb3MgY2Fzb3MgeSBubyByZXF1aWVyZSBob3NwaXRhbGl6YWNpb24uIEEgY29udGludWFjaW9uIHZlbW9zIHVuIG1hcGEgZW4gZWwgY3VhbCBsYSBpbnRlbnNpZGFkIGRlbCBjb2xvciByZWZsZWphIGxhIG1vcnRhbGlkYWQgYnJ1dGEgZGUgbGEgZW5mZXJtZWRhZCwgQ2FiZSBkZXN0YWNhciBxdWUgYXVucXVlIGFsZ3Vub3MgZXN0YWRvcyBjb21vIEhpZGFsZ28sIER1cmFuZ28geSBNb3JlbG9zIHByZXNlbnRhbiB1bmEgbW9ydGFsaWRhZCBhbHRhLCBlbCBudW1lcm8gdG90YWwgZGUgaW5mZWN0YWRvcyBlcyBtdWNobyBtZW5vciBxdWUgb3RyYXMgY2l1ZGFkZXMgbWFzIGdyYW5kZXMuIEVzdG8gdGFtYmllbiBwdWVkZSBzZXIgdW4gaW5kaWNhZG9yIGRlIGxhIG5lY2VzaWRhZCBkZSBpbmNyZW1lbnRhciBlbCBudW1lcm8gZGUgbXVlc3RyZW9zIHBhcmEgYXNpIHBvZGVyIGRldGVjdGFyIG5vIHNvbG8gYSBsb3MgcGFjaWVudGVzIHF1ZSBsbGVnYW4gYSBob3NwaXRhbCBlbiBlc3RhZG8gY3JpdGljbyAod3VlIHNvbiBsb3MgcXVlIHRlbmRlcmFuIG1hcyBhIHBhZGVjZXIgZGUgbGEgZW5mZXJtZWRhZCkuICANCg0KYGBge3J9DQojIyMjIw0KIyBDcmVhciBtYXBhIGRlIG1vcnRhbGlkYWQNCmNvbHBhbCA8LSBnckRldmljZXM6OmNvbG9yUmFtcFBhbGV0dGUoY29sb3JzID0gYygiYmxhY2siLCAicmVkIikpKDUpDQp0bV9zaGFwZShNYXBERikgKw0KICB0bV9wb2x5Z29ucyhjb2wgPSAibW9ydGFsaWRhZCIsIHN0eWxlID0gImplbmtzIiwgcGFsZXR0ZSA9IGNvbHBhbFstMV0sIGNvbG9yTkEgPSBjb2xwYWxbMV0sIGJvcmRlci5jb2wgPSAiYmxhY2siKSArDQogIHRtX2xheW91dChmcmFtZSA9IEYsIGxlZ2VuZC5vdXRzaWRlID0gVCwgbGVnZW5kLm91dHNpZGUucG9zaXRpb24gPSAicmlnaHQiLCB0aXRsZSA9ICJNb3J0YWxpZGFkIHJlcG9ydGFkYSBwb3IgRXN0YWRvIikNCmBgYA0KDQoNCiMgRXN0aW1hY2lvbiBkZSAkUl8wJCANCg0KQ29tbyBsbyBkaXNjdXRpbW9zIGVuIGVsIHBvc3QgYW50ZXJpb3IsIHVuIGluZGljYWRvciBxdWUgbm9zIGF5dWRhIGEgZXN0aW1hciBsYSBtYWduaXR1ZCBkZSBsYXMgZXBpZGVtaWFzIGVzIGVsIG51bWVybyAkUl8wJCwgZWwgY3VhbCByZXByZXNlbnRhIGVsIG51bWVybyBkZSBjYXNvcyBzZWN1bmRhcmlvcyBwcm9kdWNpZG9zLiBBbnRlcmlvcm1lbnRlIGNhbGN1bGFtb3MgdW4gJFJfMCQgcGFyYSB0b2RvIGVsIHBlcmlvZG8gZGUgbGEgZXBpZGVtaWEsIGxvIGN1YWwgbm9zIGRhIHVuYSBpZGVhIGRlIGxhIG1hZ25pdHVkIGRlIHVuYSBtYW5lcmEgZ2xvYmFsLiBTaW1pbGFyIGEgJFJfMCQsIGV4aXN0ZSBvdHJvIGluZGljYWRvciBkZSBlbCBudW1lcm8gZGUgY2Fzb3Mgc2VjdW5kYXJpb3MgcGFyYSBlbCBkaWEtYS1kaWEgKCRSX2UkKSwgZXN0byBub3MgcHVlZGUgYXl1ZGFyIGEgZGFybGUgdW4gc2VndWltaWVudG8gdGVtcG9yYWwgYSBlbCBpbXBhY3RvIGRlIGxhIGVuZmVybWVkYWQuIEV4aXN0ZW4gdmFyaW9zIG1ldG9kb3MgcGFyYSBjYWxjdWxhciAkUl9lJCwgYSBjb250aW51YWNpb24gdXNhcmVtb3MgdW4gbWV0b2RvIGRlc2Fycm9sbGFkbyBwb3IgQW5uZSBDb3JpIHkgZXh0ZW5kaWRvIHBvc3Rlcmlvcm1lbnRlIHBvciBbVGhvbXBzb24gZXQgYWwuXShodHRwczovL3d3dy5zY2llbmNlZGlyZWN0LmNvbS9zY2llbmNlL2FydGljbGUvcGlpL1MxNzU1NDM2NTE5MzAwMzUwP3ZpYSUzRGlodWIpLiBQYXJhIGVzdG8gdXRpbGl6YXJlbW9zIGVsIHBhcXVldGUgZGUgUiBgRXBpRXN0aW1gLiAgVW5vIGRlIGxvcyBwcmluY2lwYWxlcyBwYXJhbWV0cm9zIHBhcmEgZXN0aW1hciAkUl9lJCBlcyBlbCBlbCBpbnRlcnZhbG8gc2VyaWFsIChTSSksIGVsIGN1YWwgZXMgZWwgdGllbXBvIGVudHJlIGVsIGluaWNpbyBkZSBsb3Mgc2ludG9tYXMgZGUgY2FkYSBjYXNvIHkgZWwgaW5jaW8gZGUgbG9zIHNpbnRvbWFzIGRlIHVuIGNhc28gc2VjdW5kYXJpbyBhIGVzdGUgKGVuIG90cmFzIHBhbGFicmFzIGVzIGVsIHRpZW1wbyBlbnRyZSBjYXNvcykuIFRvbWFyZW1vcyBsYSBkaXN0cmlidWNpb24gZGUgU0kgZGVzY3JpdGEgcG9yIFtMaSBldC4gYWxdKGh0dHBzOi8vd3d3Lm5lam0ub3JnL2RvaS9mdWxsLzEwLjEwNTYvTkVKTW9hMjAwMTMxNiksIGVuIGxhIGN1YWwgc2UgZXN0aW1vIHVuYSBtZWRpYSBkZSA3LjUgZGlhcyBjb24gdW5hIGRlc3ZpYWNpb24gZXN0YW5kYXJkIGRlIDMuNCBkaWFzLiBEYWRvIHF1ZSBhdW4gZGVzY29ub2NlbW9zIG11Y2hvcyBhc3BlY3RvcyBkZSBsYSBlbmZlcm1lZGFkLCBpbnRyb2R1Y2lyZW1vcyBhbGd1bm9zIHBhcmFtZXRyb3MgYWRpY2lvbmFsZXMgcGFyYSBwZXJtaXRpciBxdWUgZWwgcGFyYW1ldHJvIFNJIHRlbmdhIHVuYSB2YXJpYWNpb24gZW50cmUgMi4zIHkgOC40IHVzYW5kbyB1bmEgZGlzdHJpYnVjaW9uIGVzdGFuZGFyZCBjb24gJFxzaWdtYSA9IDIkLiAgDQogIA0KDQoNCmBgYHtyIFVuY2VydGFpbnR5IHBsb3QgVjJ9DQojIyMjIw0KI0Z1bmNpb24gcGFyYSBjYWxjdWxhciBSZSB5IGdyYWZpY2FyIGxhIGxpbmVhIGRlIHRpZW1wbw0KUGxvdF9VSV9SIDwtIGZ1bmN0aW9uKEVzdCwgY29sb3Ipew0KICBFc3RfSSA8LSBDYXNlc19Fc3RhZG8gJT4lDQogICAgZ3JvdXBfYnkoRXN0YWRvKSAlPiUNCiAgICBtdXRhdGUobG9jYWwgPSBsZWFkKEwpLCANCiAgICAgICAgICAgbG9jYWwgPSBsYWcobG9jYWwgLSBMKSwNCiAgICAgICAgICAgbG9jYWwgPSBpZmVsc2UoaXMubmEobG9jYWwpLCBMLCBsb2NhbCksDQogICAgICAgICAgIGltcG9ydGVkID0gbGVhZChJKSwgDQogICAgICAgICAgIGltcG9ydGVkID0gbGFnKGltcG9ydGVkIC0gSSksDQogICAgICAgICAgIGltcG9ydGVkID0gaWZlbHNlKGlzLm5hKGltcG9ydGVkKSwgSSwgaW1wb3J0ZWQpKSAlPiUNCiAgICBmaWx0ZXIoRXN0YWRvID09IEVzdCkgJT4lIGRhdGEuZnJhbWUoKSAlPiUNCiAgbXV0YXRlKGNzID0gY3Vtc3VtKGxvY2FsKSArIGN1bXN1bSgoaW1wb3J0ZWQpKSkgJT4lDQogIGZpbHRlcihjcyA+IDApICU+JQ0KICBzZWxlY3QoRmVjaGEsIGxvY2FsLCBpbXBvcnRlZCkgJT4lDQogIGVzdGltYXRlX1IoLiwgbWV0aG9kPSJ1bmNlcnRhaW5fc2kiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcgPSBtYWtlX2NvbmZpZyhsaXN0KA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYW5fc2kgPSA3LjUsIHN0ZF9tZWFuX3NpID0gMi4wLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9tZWFuX3NpID0gMSwgbWF4X21lYW5fc2kgPSA4LjQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkX3NpID0gMy40LCBzdGRfc3RkX3NpID0gMS4wLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9zdGRfc2kgPSAwLjUsIG1heF9zdGRfc2kgPSA0LjAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbjEgPSAxMDAwLCBuMiA9IDEwMDApKSkgJT4lDQogIC4kUiAlPiUNCiAgc2VsZWN0KEZlY2hhID0gdF9zdGFydCwgTSA9IGBNZWFuKFIpYCwgUTEgPSBgUXVhbnRpbGUuMC4wMjUoUilgLCBRMyA9IGBRdWFudGlsZS4wLjc1KFIpYCkgJT4lDQogIGdncGxvdCguLCBhZXMoeCA9IEZlY2hhKSkgKw0KICBnZW9tX3JpYmJvbihhZXMoeW1pbiA9IFExLCB5bWF4ID0gUTMpLCBmaWxsID0gY29sb3IsIGFscGhhID0gMC4yKSArDQogIGdlb21fbGluZShhZXMoeSA9IE0pLCBjb2wgPSBjb2xvciwgbHdkID0gMSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAxLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogICMgbGltcyh5ID0gYygtMSwgMTUpKSArDQogIGxhYnModGl0bGUgPSBwYXN0ZSgiRXN0aW1hZG8gUiBpbnN0YW50YW5lbyAtICIsIEVzdCkpICMrDQogICAgI3RoZW1lX21pbmltYWwoKQ0KICByZXR1cm4oRXN0X0kpDQp9DQpgYGANCg0KRW4gbnVlc3Ryc28gcmVzdWx0YWRvcyBwb2RlbW9zIG9ic2VydmFyIGVsICRSX2UkIGVzdGltYWRvIGVuIHVuYSBsaW5lYSBkZWwgdGllbXBvLiBDb21vIG1lbmNpb25hbW9zIGFudGVyaW9ybWVudGUsIGVsIG9iamV0aXZvIHBhcmEgZXZpdGFyIHF1ZSB1bmEgZW5mZXJtZWRhZCBzZSBjb252aWVydGEgZW4gZXBpZGVtaWEgZXMgbWFudGVuZXIgZWwgJFJfZSQgcG9yIGRlYmFqbyBkZSB1bm8gKGVsIGN1YWwgZXN0YSBtYXJjYWRvIGNvbiB1bmEgbGluZWEgcHVudGVhZGEpLiBMYSBsaW5lYSBkZSBlbm1lZGlvIHJlcHJlc2VudGEgbnVlc3RyYSBlc3RpbWFjaW9uIHkgZWwgc29tYnJlYWRvIHF1ZSBsYSBlbnZlbHZlIGVzIGxhIGluY2VydGlkdW1icmUgZGUgbnVlc3RyYSBlc3RpbWFjaW9uIChudWVzdHJvIHZlcmRhZGVybyB2YWxvciBwb2RyaWEgZXN0YXIgZW4gY3VhbHF1aWVyIHBhcnRlIGRlbCBhcmVhIHNvbWJyZWFkYSkuIEVzIGltcG9ydGFudGUgZGVzdGFjYXIgcXVlIGxvcyBlamVzIGVzdGFuIGVuIGRpZmVyZW50ZXMgZXNjYWxhcywgcG9kZW1vcyBxdWUgYXVucXVlIGVsIHBhdHJvbiBwYXJhIFB1ZWJsYSB5IGVsIEVzdGFkbyBkZSBNZXhpY28gZXMgcGFyZWNpZG8sIGxvcyB2YWxvcmVzIHBhcmEgZWwgRXN0YWRvIGRlIE1leGljbyBwb2RyaWFuIGFsY2FuemFyIGhhc3RhIHVuICRSX2UkIGRlIDYuICAgICAgIA0KDQpgYGB7ciBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xNH0NCiMjIyMjDQojIyBHcmFmaWNhciBlbCBSZSBwb3IgZXN0YWRvIChUb3AgNikNCiMgQ3JlYXIgcGFsZXRhIGRlIGNvbG9yZXMNCmNvbHBhbCA8LSByYWluYm93KDYsIHYgPSAwLjcpDQojIFNlbGVjY2lvbmFyIGxvcyBlc3RhZG9zDQpFc3QgPC0gYXMuY2hhcmFjdGVyKEVzdGFkb3Nfc3VtJEVzdGFkb1sxOjZdKQ0KIyBHdWFyZGFyIGxvcyByZXN1bHRhZG9zIGVuIG9iamV0b3MNCkNNWCA8LSBQbG90X1VJX1IoRXN0ID0gRXN0WzFdLCBjb2xvciA9IGNvbHBhbFsxXSkNCk1FWCA8LSBQbG90X1VJX1IoRXN0ID0gRXN0WzJdLCBjb2xvciA9IGNvbHBhbFsyXSkNCkpBTCA8LSBQbG90X1VJX1IoRXN0ID0gRXN0WzNdLCBjb2xvciA9IGNvbHBhbFszXSkNClBVRSA8LSBQbG90X1VJX1IoRXN0ID0gRXN0WzRdLCBjb2xvciA9IGNvbHBhbFs0XSkNCk5MRSA8LSBQbG90X1VJX1IoRXN0ID0gRXN0WzVdLCBjb2xvciA9IGNvbHBhbFs1XSkNCllVQyA8LSBQbG90X1VJX1IoRXN0ID0gRXN0WzZdLCBjb2xvciA9IGNvbHBhbFs2XSkNCiMgUG9uZXIgdG9kb3MgbG9zIG9iamV0b3MgZW4gdW5hIHNvbGEgZmlndXJhDQpGaWcgPC0gZ2dhcnJhbmdlKENNWCwgTUVYLCBKQUwsIFBVRSwgTkxFLCBZVUMsIG5yb3cgPSAyLCBuY29sID0gMykNCiMgR3JhZmljYXIgbG9zIG9iamV0b3MgY29uIHVuIHRpdHVsbw0KYW5ub3RhdGVfZmlndXJlKEZpZywgdG9wID0gdGV4dF9ncm9iKCJSMCBJbnN0YW50YW5lbyBwYXJhIGxvcyBlc3RhZG9zIGNvbiBtYXlvciBjYXNvcyIsIHNpemUgPSAyNSwgZmFjZSA9ICJib2xkIikpDQpgYGANCg0KU3Vwb25pZW5kbyBxdWUgZWwgbnVtZXJvIGRlIGNhc29zIHJlcG9ydGFkb3MgcmVmbGVqYSBjb24gY2VydGV6YSBsYSBwcm9ncmVzaW9uIGRlIGxhIGVuZmVybWVkYWQsIG51ZXN0cm8gYW5hbGlzaXMgbm9zIGRpY2UgcXVlIGxhIGVuZmVybWVkYWQgdmEgZGVjcmVjaWVuZG8gZW4gZXN0YWRvcyBjb21vIE51ZXZvIExlb24sIEphbGlzY28geSBZdWNhdGFuLiBQYXJhIGxvcyBlc3RhZG9zIGRlIE51ZXZvIExlb24geSBKYWxpc2NvIGVsICRSX2UkIHNlIG1hbnRpZW5lIHBvciBkZWJham8gZGUgbGEgbGluZWEgcXVlIG1hcmNhIGVsIDEgeSBzZSBkZWJlIG1hbnRlbmVyIGFzaSBzaSBxdWVyZW1vcyBlbGltaW5hciBsYSB0cmFuc21pc2lvbi4gRW4gY2FtYmlvIGVuIENETVgsIGVzdGFkbyBkZSBNZXhpY28geSBQdWVibGEgdmVtb3MgcXVlIGh1Ym8gdW5hIGRlY2FpZGEgZW4gZWwgJFJfZSQgeSBoYSB2dWVsdG8gYSBhdW1lbnRhcmVuIGxvcyB1bHRpbW9zIGRpYXMsIHJlY29yZGVtb3MgcXVlIGVzdGUgYW5hbGlzcyBlc3RhIGJhc2FkbyBlbiBlbCBudW1lcm8gZGUgaW5kaXZpZHVvcyBkZXRlY3RhZG9zIHkgbm8gbmVjZXNhcmlhbWVudGUgZWwgbnVtZXJvIHRvdGFsIGRlIGluZmVjdGFkb3MuIEVsIGhlY2hvIGRlIHF1ZSBlbCAkUl9lJCB2YXlhIGVuIGF1bWVudG8sIHRhbWJpZW4gcG9kcmlhIHJlZmxlamFyIGVsIGluY3JlbWVudG8gZW4gbG9zIGVzZnVlcnpvcyBkZSBkZXRlY2Npb24gZGUgbGEgZW5mZXJtZWRhZC4gIA0KICANCkVuIHJlc3VtZW4sIGFsZ3VuYXMgZGUgZXN0YXMgaGVycmFtaWVudGFzIHBvZHJpYW4gc2VyIHV0aWxpemFkYXMgcGFyYSBpbmZvcm1hciBsb3MgbHVnYXJlcyBlbiBsb3MgcXVlIGxhIGVuZmVybWVkYWQgdmEgZW4gYXNlbnNvIHkgb3Ryb3MgbHVnYXJlcyBxdWUgbmVjZXNpdGFuIG1hcyBlc2Z1ZXJ6b3MgZW4gY3VhbnRvIGEgbGEgZGV0ZWNjaW9uIGRlIGxhIGVuZmVybWVkYWQuICANCg0KIyBBcGVuZGljZSAgDQpQb3IgdWx0aW1vLCBhbmV4byBlbCBjb2RpZ28gcG9yIHNpIHNlIGRlc2VhIHJlcGxpY2FyIGVsIGFuYWxpc2lzLiBFbCBjb2RpZ28gYSBjb250aW51YWNpb24gZGVzY3JpYmUgbG8gcmVhbGl6YWRvIGVuIGVzdGUgcG9zdCB5IHBhcmEgYWNjZWRlciBhIGxvcyBkYXRvcyB5IGRhcmxlcyBlbCBmb3JtYXRvIG5lY2VzYXJpbyBlbiBlc3RlIGFuYWxpc2lzIHNlIHB1ZWRlIHNlZ3VpciBlbCBjb2RpZ28gcXVlIHNlIGVuY3VlbnRyYSBlbiBlc3RlIFtTQ1JJUFRdKENvZGUvR2V0X3RoZV9kYXRhLlIpDQoNCmBgYHtyIHJlZi5sYWJlbD1rbml0cjo6YWxsX2xhYmVscygpLGVjaG89VFJVRSxldmFsPUZBTFNFfQ0KDQpgYGANCg==